import { LocalStorage } from './local-storage.js';
import { SessionStorage } from './session-storage.js';
import { CookieStorage } from './cookie-storage.js';
import { IndexedDBStorage } from './indexeddb-storage.js';

/**
 * 统一存储管理器
 * 支持多种浏览器存储方式的统一接口
 */
class YuStorage {
  constructor(defaultType = 'local') {
    // 支持的存储类型
    this.types = {
      local: 'localStorage',
      session: 'sessionStorage',
      cookie: 'cookie',
      indexeddb: 'indexedDB'
    };

    // 存储实例映射
    this.storages = {
      [this.types.local]: new LocalStorage(),
      [this.types.session]: new SessionStorage(),
      [this.types.cookie]: new CookieStorage(),
      [this.types.indexeddb]: new IndexedDBStorage()
    };

    // 默认存储类型
    this.defaultType = this.types[defaultType] || this.types.local;
  }

  /**
   * 获取存储实例
   * @param {string} type - 存储类型
   * @returns {BaseStorage} 存储实例
   */
  getStorage(type) {
    const storageType = this.types[type] || this.defaultType;
    const storage = this.storages[storageType];
    
    if (!storage) {
      throw new Error(`Unsupported storage type: ${type}`);
    }

    if (!storage.isAvailable()) {
      console.warn(`Storage type ${storageType} is not available, falling back to localStorage`);
      return this.storages[this.types.local];
    }

    return storage;
  }

  /**
   * 设置数据
   * @param {string} key - 键名
   * @param {any} value - 值
   * @param {Object} options - 选项
   * @param {string} options.type - 存储类型
   * @returns {boolean|Promise<boolean>} 是否成功
   */
  set(key, value, options = {}) {
    const storage = this.getStorage(options.type);
    return storage.set(key, value, options);
  }

  /**
   * 获取数据
   * @param {string} key - 键名
   * @param {Object} options - 选项
   * @param {string} options.type - 存储类型
   * @returns {any|Promise<any>} 值
   */
  get(key, options = {}) {
    const storage = this.getStorage(options.type);
    return storage.get(key, options);
  }

  /**
   * 删除数据
   * @param {string} key - 键名
   * @param {Object} options - 选项
   * @param {string} options.type - 存储类型
   * @returns {boolean|Promise<boolean>} 是否成功
   */
  remove(key, options = {}) {
    const storage = this.getStorage(options.type);
    return storage.remove(key, options);
  }

  /**
   * 清空存储
   * @param {Object} options - 选项
   * @param {string} options.type - 存储类型
   * @returns {boolean|Promise<boolean>} 是否成功
   */
  clear(options = {}) {
    const storage = this.getStorage(options.type);
    return storage.clear(options);
  }

  /**
   * 获取所有键
   * @param {Object} options - 选项
   * @param {string} options.type - 存储类型
   * @returns {string[]|Promise<string[]>} 键数组
   */
  keys(options = {}) {
    const storage = this.getStorage(options.type);
    return storage.keys(options);
  }

  /**
   * 检查存储类型是否可用
   * @param {string} type - 存储类型
   * @returns {boolean} 是否可用
   */
  isAvailable(type) {
    const storage = this.storages[this.types[type]];
    return storage ? storage.isAvailable() : false;
  }

  /**
   * 获取所有可用的存储类型
   * @returns {string[]} 可用的存储类型数组
   */
  getAvailableTypes() {
    return Object.keys(this.types).filter(type => this.isAvailable(type));
  }

  /**
   * 设置默认存储类型
   * @param {string} type - 存储类型
   */
  setDefaultType(type) {
    if (this.types[type]) {
      this.defaultType = this.types[type];
    } else {
      throw new Error(`Unsupported storage type: ${type}`);
    }
  }

  /**
   * 获取存储信息
   * @param {string} type - 存储类型
   * @returns {Object|Promise<Object>} 存储信息
   */
  getStorageInfo(type) {
    const storageType = this.types[type] || this.defaultType;
    const storage = this.storages[storageType];
    
    if (!storage) {
      return {
        type: storageType,
        available: false,
        keys: []
      };
    }

    const result = {
      type: storageType,
      available: storage.isAvailable(),
      keys: []
    };

    // 处理异步的 keys 方法（如 IndexedDB）
    if (storageType === this.types.indexeddb) {
      return storage.keys().then(keys => {
        result.keys = keys;
        return result;
      }).catch(() => {
        result.keys = [];
        return result;
      });
    } else {
      // 同步存储
      result.keys = storage.keys();
      return result;
    }
  }
}

// 创建默认实例
const yuStorage = new YuStorage();

// 导出默认实例和类
export default yuStorage;
export { YuStorage };

// 导出所有存储类
export { LocalStorage } from './local-storage.js';
export { SessionStorage } from './session-storage.js';
export { CookieStorage } from './cookie-storage.js';
export { IndexedDBStorage } from './indexeddb-storage.js';
